﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace Frugtplantage
{
    public partial class main : Form
    {

        //--------------
        // Deklerationer
        //--------------
        #region Deklerationer

        // Lister
        MarkerCollection voresMarker = new MarkerCollection();
        OpgaverCollection voresOpgaver = new OpgaverCollection();
        SkaderCollection voresSkader = new SkaderCollection();
        SortCollection voresSorter = new SortCollection();
        TypeCollection voresTyper = new TypeCollection();
        
        // Andet
        public int adgangsNiveau = 0;
        string tilstand = "ingen";
        
        #endregion
        

        //-----------
        // Initialize
        //-----------
        public main()
        {
            InitializeComponent();

            // Eventhandler til at tjekke om login boksen lukkes
            this.Closing += new CancelEventHandler(this.afslut_Program);

            // Eventhandler der udføres ved valg af ny tab
            tabControl1.SelectedIndexChanged += tabControl1_SelectedIndexChanged;

            // Vis login boks
            ShowLogin();
            loadData();

        }


        //--------------------------------------------------------------------------------
        // Øvrigt funktioner (Vis login boks, set adgangs niveau, afslut eventhandler mm.)
        //--------------------------------------------------------------------------------
        #region Øvrige funktioner

        // StartUp Metode - Opsætning og starter login boks
        private void ShowLogin()
        {
            // Vis login boks
            Login login = new Login(this);
            login.ShowDialog();
        }

        // setAdgangsNiveau, kaldes fra login boks, for at skjule de knapper der ikke skal kunne benyttes af en gæst
        public void setAdgangsNiveau()
        {
            if (adgangsNiveau == 0)
            {
                MessageBox.Show("Der er sket en fejl programmet lukkes!", "Program fejl!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                Application.Exit();
            }
            else if (adgangsNiveau == 1)
            {
                // Marker
                btnFjernMark.Show();
                btnGemMark.Show();
                btnOpretMark.Show();
                btnRedigerMark.Show();

                //Sorter
                btnFjernSort.Show();
                btnGemSort.Show();
                btnOpretSort.Show();
                btnRedigerSort.Show();


                // Tab sider
                tabControl1.TabPages.Remove(tabPageMarker);
                tabControl1.TabPages.Remove(tabPageOpgaver);
                tabControl1.TabPages.Remove(tabPageSkader);
                tabControl1.TabPages.Remove(tabPageSorter);
                tabControl1.TabPages.Remove(tabPageTyper);

                tabControl1.TabPages.Add(tabPageMarker);
                tabControl1.TabPages.Add(tabPageOpgaver);
                tabControl1.TabPages.Add(tabPageSkader);
                tabControl1.TabPages.Add(tabPageSorter);
                tabControl1.TabPages.Add(tabPageTyper);
            }
            else if (adgangsNiveau == 2)
            {
                tabControl1.TabPages.Remove(tabPageMarker);
                tabControl1.TabPages.Remove(tabPageSkader);
                tabControl1.TabPages.Remove(tabPageSorter);
                tabControl1.TabPages.Remove(tabPageTyper);
            }
            else
            {
                MessageBox.Show("Der er sket en fejl programmet lukkes!", "Program fejl!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                Application.Exit();
            }

            // set formen op så stort set alle tekst felter er tomme og disable - tilstandsstyring aktiverer derefter de korrekte felter 
            // Marker
            txtMarkNummer1.Enabled = false;
            txtMarkNummer1.Text = "";
            
            txtMarkNummer2.Enabled = false;
            txtMarkNummer2.Text = "";

            txtMarkAdresse.Enabled = false;
            txtMarkAdresse.Text = "";

            txtMarkStoerrelse.Enabled = false;
            txtMarkStoerrelse.Text = "";

            cbMarkerType.Enabled = false;
            cbMarkerSort.SelectedIndex = -1;

            cbMarkerSort.Enabled = false;
            cbMarkerType.SelectedIndex = -1;

            dtpMarkerPlantetDato.Enabled = false;
            dtpMarkerPlantetDato.Value = DateTime.Now;
            

            // Opgaver
            txtOpgaverBeskrivelse.Enabled = false;
            txtOpgaverBeskrivelse.Text = "";

            txtOpgaverNavn.Enabled = false;
            txtOpgaverNavn.Text = "";
            
            cbOpgaverSted.Enabled = false;
            cbOpgaverSted.SelectedItem = "";
            
            dtpOpgaverStart.Enabled = false;
            dtpOpgaverStart.Value = DateTime.Today;

            dtpOpgaverSlut.Enabled = false;
            dtpOpgaverSlut.Value = DateTime.Today;

           

            // Skader

            cbMarkNummer.Enabled = false;
            cbMarkNummer.SelectedItem = "";

            txtSkadeType.Enabled = false;
            txtSkadeType.Text = "";

            txtSkadeBeskrivelse.Enabled = false;
            txtSkadeBeskrivelse.Text = "";
            
            // Sorter
            txtSortNavn.Enabled = false;
            txtSortNavn.Text = "";

            txtSortNummer.Enabled = false;
            txtSortNummer.Text = "";

            cbSortType.Enabled = false;
            cbSortType.SelectedItem = -1;

            // Typer
            txtTypeNavn.Enabled = false;
            txtTypeNavn.Text = "";

        }

        // Metode der kaldes når eventhandleren fanger at programmet lukkes
        private void afslut_Program(object sender, System.ComponentModel.CancelEventArgs e)
        {
            if (MessageBox.Show("Ønsker du at afslutte?", "Afslut", MessageBoxButtons.OKCancel) == DialogResult.OK)
            {
                // Gem data til bin fil når der lukkes
                gemData();
                // Luk prgrammet
                e.Cancel = false;
                Application.Exit();
            }
            else
            {
                e.Cancel = true;
            }
        }

        // Opdater felter når der vælges faneblad
        private void tabControl1_SelectedIndexChanged(Object sender, EventArgs e)
        {
            if (tabControl1.SelectedTab == tabPageMarker)
            {
                resetMarkerFelter();
                updateMarker();
            }
            if (tabControl1.SelectedTab == tabPageOpgaver)
            {
                resetOpgaveFelter();
                updateOpgaver();
            }
            if (tabControl1.SelectedTab == tabPageSkader)
            {
                resetSkaderFelter();
                updateSkader();
            }
            if (tabControl1.SelectedTab == tabPageSorter)
            {
                resetSorterFelter();
                updateSorter();
            }
            if (tabControl1.SelectedTab == tabPageTyper)
            {
                resetTypeFelter();
                updateTyper();
            }
        }

        // Åben about boks
        private void omkringFrugtplantageToolStripMenuItem_Click(object sender, EventArgs e)
        {
            AboutBox1 about = new AboutBox1();
            about.ShowDialog();
        }

        // Gem data til bin fil på harddisken
        private void gemData()
        {
            
            voresMarker.GemData();
            voresOpgaver.GemData();
            voresSkader.GemData();
            voresSorter.GemData();
            voresTyper.GemData();
        }

        // Hent data fra bin fil på harddisken
        private void loadData()
        {
            if (File.Exists("marker.bin") && File.Exists("opgaver.bin") && File.Exists("skader.bin") && File.Exists("sorter.bin") && File.Exists("typer.bin"))
            {
                voresMarker.HentData();
                voresOpgaver.HentData();
                voresSkader.HentData();
                voresSorter.HentData();
                voresTyper.HentData();

                updateMarker();
            }
        }

        #endregion
        


        //------------------
        // MenuStrip metoder
        //------------------
        #region MenuStrip metoder

        // Logud metode
        private void logudToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Login login = new Login(this);
            login.ShowDialog();
        }

        // Afslut metode
        private void afslutToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        #endregion


        //-------
        // Marker
        //-------
        #region Marker

        // Opret mark metode
        private void btnOpretMark_Click(object sender, EventArgs e)
        {
            if (tilstand == "ingen")
            {
                resetMarkerFelter();
                tilstand = "opretMark";

                txtMarkNummer1.Enabled = true;
                txtMarkNummer2.Enabled = true;
                txtMarkAdresse.Enabled = true;
                txtMarkStoerrelse.Enabled = true;
                cbMarkerType.Enabled = true;
                cbMarkerSort.Enabled = true;
                dtpMarkerPlantetDato.Enabled = true;
            }
        }

        // Rediger mark metode
        private void btnRedigerMark_Click(object sender, EventArgs e)
        {

            if (lsbMarker.SelectedItems.Count > 0)
            {
                tilstand = "redigerMark";
                txtMarkNummer1.Enabled = true;
                txtMarkNummer2.Enabled = true;
                txtMarkAdresse.Enabled = true;
                txtMarkStoerrelse.Enabled = true;
                cbMarkerType.Enabled = true;
                cbMarkerSort.Enabled = true;
                dtpMarkerPlantetDato.Enabled = true;
            }
            else if (tilstand == "opretMark")
            {
                return;
            }
            else
            {
                MessageBox.Show("Der skal vælges en mark.", "Mangler valgt mark", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        // Fjern mark metode
        private void btnFjernMark_Click(object sender, EventArgs e)
        {
            if (tilstand == "ingen" && lsbMarker.SelectedItems.Count > 0)
            {
                if (MessageBox.Show("Ønsker du at slette?", "Slet mark?", MessageBoxButtons.OKCancel) == DialogResult.OK)
                {
                    int selectedIndex = lsbMarker.SelectedIndices[0];
                    voresMarker.FjernMyMark(selectedIndex);
                    updateMarker();
                    resetMarkerFelter();
                }
            }
            else if (tilstand == "ingen")
            {
                MessageBox.Show("Der skal vælges en mark.", "Mangler valgt mark", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        // Fortryd mark metode
        private void btnMarkerFortryd_Click(object sender, EventArgs e)
        {
            if (tilstand != "ingen")
            {
                resetMarkerFelter();
                updateMarker();
            }
        }

        // Gem mark metode
        private void btnGemMark_Click(object sender, EventArgs e)
        {
            if (tilstand == "opretMark" || tilstand == "redigerMark")
            {
                // Dekleration af sort nummer og tryparse test om det er et nummer, hvis ikke vis message boks og stop
                int markNummer1;
                int markNummer2;
                bool nr1 = int.TryParse(txtMarkNummer1.Text, out markNummer1);
                bool nr2 = int.TryParse(txtMarkNummer2.Text, out markNummer2);
                if (!nr1 || !nr2)
                {
                    MessageBox.Show("Nummer 1 eller 2 mangler, eller er ikke numrisk(e).", "Fejl i nummer(e)", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                // Konverter sortTavn textbox samt sortType textbox til string
                
                string markAdresse = Convert.ToString(txtMarkAdresse.Text);
                string markStoerrelse = Convert.ToString(txtMarkStoerrelse.Text);
                string markSort = Convert.ToString(cbMarkerSort.SelectedItem);
                string markType = Convert.ToString(cbMarkerType.SelectedItem);
                DateTime dato = dtpMarkerPlantetDato.Value;

                // Tjek om der er noget i både markNavn, markStørrelse, markSort og markType
                if (markAdresse.Length <= 0)
                {
                    MessageBox.Show("Navn mangler.", "Fejl i navn", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                if (markStoerrelse.Length <= 0)
                {
                    MessageBox.Show("Størrelse mangler.", "Fejl i størrelse", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                if (markSort.Length <= 0)
                {
                    MessageBox.Show("Sort ikke valgt.", "Fejl i sort", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                if (markType.Length <= 0)
                {
                    MessageBox.Show("Type ikke valgt.", "Fejl i type", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                // Hvis vi er i opretTilstand
                if (tilstand == "opretMark")
                {
                    voresMarker.SetMyMark(markNummer1, markNummer2, markAdresse, markStoerrelse, markType, markSort, dato);
                    //voresSorter.SetMySort(sortNummer, sortNavn, sortType);
                    resetMarkerFelter();
                    updateMarker();
                }
                // Hvis vi er er redigerTilstant
                else if (tilstand == "redigerMark")
                {
                    int selectedIndex = lsbMarker.SelectedIndices[0];
                    voresMarker.updateMyMark(selectedIndex, markNummer1, markNummer2, markAdresse, markStoerrelse, markType, markSort, dato);
                    resetMarkerFelter();
                    updateMarker();

                    
                }
            }
        }

        

        // Når en mark vælges
        private void lsbMarker_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (tilstand != "opretMark" && lsbMarker.SelectedItems.Count > 0)
            {
                int selectedIndex = lsbMarker.SelectedIndices[0];
                ListViewItem minListe = lsbMarker.Items[selectedIndex];

                string[] mitHelNummer = minListe.SubItems[0].Text.Split('-');

                txtMarkNummer1.Text = mitHelNummer[0].ToString();
                txtMarkNummer2.Text = mitHelNummer[1].ToString();
                txtMarkAdresse.Text = minListe.SubItems[1].Text;
                txtMarkStoerrelse.Text = minListe.SubItems[2].Text;
                cbMarkerType.SelectedItem = minListe.SubItems[3].Text;
                cbMarkerSort.SelectedItem = minListe.SubItems[4].Text;
                DateTime markPlantet = Convert.ToDateTime(minListe.SubItems[6].Text);

                dtpMarkerPlantetDato.Value = markPlantet;

            }
        }

        // Opdater listview
        private void updateMarker()
        {

            // Opdater Sorter listview
            lsbMarker.Items.Clear();
            List<Marker> minListe = voresMarker.GetMyMark();

            foreach (var item in minListe)
            {
                string markNummer = Convert.ToString(item.Nummer1) + "-" + Convert.ToString(item.Nummer2);
                string markAdresse = Convert.ToString(item.Adresse);
                string markStoerrelse = Convert.ToString(item.Stoerrelse);
                string markType = Convert.ToString(item.Type);
                string markSort = Convert.ToString(item.Sort);
                DateTime markPlantetTemp = item.Alder;
                DateTime nowTemp = DateTime.Today;
                string markPlantet = String.Format("{0:dd-MM-yyyy}", markPlantetTemp);
                int markAlderTemp = nowTemp.Year - markPlantetTemp.Year;
                if (nowTemp.Month < markPlantetTemp.Month || (nowTemp.Month == markPlantetTemp.Month && nowTemp.Day < markPlantetTemp.Day))
                {
                    markAlderTemp--;
                }

                string markAlder = Convert.ToString(markAlderTemp);
                ListViewItem mineItems = new ListViewItem(new[] { markNummer, markAdresse, markStoerrelse, markType, markSort, markAlder, markPlantet });
                lsbMarker.Items.Add(mineItems);
            }

            // Opdater type comboboks
            cbMarkerType.Items.Clear();
            foreach (var item in voresTyper.GetMyType())
            {
                cbMarkerType.Items.Add(item);
            }

            // Opdater sort comboboks
            cbMarkerSort.Items.Clear();

            foreach (var item in voresSorter.GetMySort())
            {
                cbMarkerSort.Items.Add(item.SortNavn);
            }
        }

        // Reset felter
        private void resetMarkerFelter()
        {
            txtMarkNummer1.Enabled = false;
            txtMarkNummer1.Text = "";

            txtMarkNummer2.Enabled = false;
            txtMarkNummer2.Text = "";

            txtMarkAdresse.Enabled = false;
            txtMarkAdresse.Text = "";

            txtMarkStoerrelse.Enabled = false;
            txtMarkStoerrelse.Text = "";

            cbMarkerType.Enabled = false;
            cbMarkerSort.SelectedIndex = -1;

            cbMarkerSort.Enabled = false;
            cbMarkerType.SelectedIndex = -1;

            dtpMarkerPlantetDato.Enabled = false;
            dtpMarkerPlantetDato.Value = DateTime.Now;

            lsbMarker.SelectedItems.Clear();
            // Reset tilstand
            tilstand = "ingen";
        }



        #endregion


        //--------
        // Opgaver
        //--------
        #region Opgaver

        // Opret opgave metode
        private void btnOpgaverOpret_Click(object sender, EventArgs e)
        {
            if (tilstand == "ingen")
            {
                resetOpgaveFelter();
                tilstand = "opretOpgave";

                txtOpgaverBeskrivelse.Enabled = true;
                txtOpgaverNavn.Enabled = true;
                cbOpgaverSted.Enabled = true;
                dtpOpgaverStart.Enabled = true;
                dtpOpgaverSlut.Enabled = true;
            }
        }

        // Rediger opgave metode
        private void btnOpgaverRediger_Click(object sender, EventArgs e)
        {
            if (lsbOpgaver.SelectedItems.Count > 0)
            {
                tilstand = "redigerOpgave";
                txtOpgaverBeskrivelse.Enabled = true;
                txtOpgaverNavn.Enabled = true;
                cbOpgaverSted.Enabled = true;
                dtpOpgaverStart.Enabled = true;
                dtpOpgaverSlut.Enabled = true;
            }
            else if (tilstand == "opretOpgave")
            {
                return;
            }
            else
            {
                MessageBox.Show("Der skal vælges en opgave.", "Mangler valgt opgave", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        // Fjern opgave metode
        private void btnOpgaverFjern_Click(object sender, EventArgs e)
        {
            if (tilstand == "ingen" && lsbOpgaver.SelectedItems.Count > 0)
            {
                if (MessageBox.Show("Ønsker du at slette?", "Slet opgave?", MessageBoxButtons.OKCancel) == DialogResult.OK)
                {
                    int selectedIndex = lsbOpgaver.SelectedIndices[0];
                    voresOpgaver.FjernMyOpgave(selectedIndex);
                    updateOpgaver();
                    resetOpgaveFelter();
                }
            }
            else if (tilstand == "ingen")
            {
                MessageBox.Show("Der skal vælges en mark.", "Mangler valgt mark", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        // Fortryd opgave metode
        private void btnOpgaverFortryd_Click(object sender, EventArgs e)
        {
            if (tilstand != "ingen")
            {
                updateOpgaver();
                resetOpgaveFelter();
            }
        }

        // Gem opgave metode
        private void btnOpgaverGem_Click(object sender, EventArgs e)
        {
            if (tilstand == "opretOpgave" || tilstand == "redigerOpgave")
            {
                // Konverter navn textbox samt beskrivelse textbox til string

                string opgaveNavn = Convert.ToString(txtOpgaverNavn.Text);
                string opgaveBeskrivelse = Convert.ToString(txtOpgaverBeskrivelse.Text);
                string opgaveSted = Convert.ToString(cbOpgaverSted.SelectedItem);
                DateTime datoStart = dtpOpgaverStart.Value;
                DateTime datoSlut = dtpOpgaverSlut.Value;

                // Tjek om der er noget i både markNavn, markStørrelse, markSort og markType
                if (opgaveNavn.Length <= 0)
                {
                    MessageBox.Show("Navn mangler.", "Fejl i navn", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                if (opgaveBeskrivelse.Length <= 0)
                {
                    MessageBox.Show("Beskrivelse mangler.", "Fejl i beskrivelse", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                if (opgaveSted.Length <= 0)
                {
                    MessageBox.Show("Sted ikke valgt.", "Fejl i sted", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                // Hvis vi er i opretTilstand
                if (tilstand == "opretOpgave")
                {
                    voresOpgaver.SetMyOpgave(opgaveNavn, opgaveBeskrivelse, opgaveSted, datoStart, datoSlut);
                    resetOpgaveFelter();
                    updateOpgaver();
                }
                // Hvis vi er er redigerTilstant
                else if (tilstand == "redigerOpgave")
                {
                    int selectedIndex = lsbOpgaver.SelectedIndices[0];
                    voresOpgaver.updateMyOpgave(selectedIndex, opgaveNavn, opgaveBeskrivelse, opgaveSted, datoStart, datoSlut);
                    resetOpgaveFelter();
                    updateOpgaver();
                }
            }
        }

        // Når en opgave vælges
        private void lsbOpgaver_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (tilstand != "opretOpgave" && lsbOpgaver.SelectedItems.Count > 0)
            {
                int selectedIndex = lsbOpgaver.SelectedIndices[0];
                ListViewItem minListe = lsbOpgaver.Items[selectedIndex];

                txtOpgaverNavn.Text = Convert.ToString(minListe.SubItems[0].Text);
                txtOpgaverBeskrivelse.Text = Convert.ToString(minListe.SubItems[1].Text);
                cbOpgaverSted.SelectedItem = minListe.SubItems[2].Text;
                DateTime startTid = Convert.ToDateTime(minListe.SubItems[3].Text);
                DateTime slutTid = Convert.ToDateTime(minListe.SubItems[4].Text);
                dtpOpgaverStart.Value = startTid;
                dtpOpgaverSlut.Value = slutTid;
            }
        }

        // Opdater listview
        private void updateOpgaver()
        {
            // Opdater opgaver listview
            lsbOpgaver.Items.Clear();
            List<Opgaver> minListe = voresOpgaver.GetMyOpgave();

            foreach (var item in minListe)
            {
                string opgaveNavn = Convert.ToString(item.Navn);
                string opgaveBeskrivelse = Convert.ToString(item.Beskrivelse);
                string markSted = Convert.ToString(item.Sted);
                string datoStart = String.Format("{0:dd-MM-yyyy}", item.StartTid);
                string datoSlut = String.Format("{0:dd-MM-yyyy}", item.SlutTid);

                ListViewItem mineItems = new ListViewItem(new[] { opgaveNavn, opgaveBeskrivelse, markSted, datoStart, datoSlut });
                lsbOpgaver.Items.Add(mineItems);
            }

            // Opdater sted comboboks
            cbOpgaverSted.Items.Clear();
            foreach (var item in voresMarker.GetMyMark())
            {
                cbOpgaverSted.Items.Add(item.Nummer1 + "-" + item.Nummer2 + " : " + item.Adresse);
            }
        }

        // Reset felter
        private void resetOpgaveFelter()
        {

            txtOpgaverBeskrivelse.Enabled = false;
            txtOpgaverBeskrivelse.Text = "";

            txtOpgaverNavn.Enabled = false;
            txtOpgaverNavn.Text = "";

            cbOpgaverSted.Enabled = false;
            cbOpgaverSted.SelectedItem = "";

            dtpOpgaverStart.Enabled = false;
            dtpOpgaverStart.Value = DateTime.Today;

            dtpOpgaverSlut.Enabled = false;
            dtpOpgaverSlut.Value = DateTime.Today;

            lsbOpgaver.SelectedItems.Clear();

            // Reset tilstand
            tilstand = "ingen";
        }

        #endregion


        //-------
        // Skader
        //-------
        #region Skader

        private void btnOpretSkade_Click(object sender, EventArgs e)
        {
            if (tilstand == "ingen")
            {
                resetSkaderFelter();
                tilstand = "opretSkade";

                cbMarkNummer.Enabled = true;
                txtSkadeType.Enabled = true;
                txtSkadeBeskrivelse.Enabled = true;
                               
            }
        }

        private void btnRedigerSkader_Click(object sender, EventArgs e)
        {
            if (lsbSkader.SelectedItems.Count > 0 && tilstand == "ingen")
            {
                tilstand = "redigerSkade";
                
                cbMarkNummer.Enabled = true;
                txtSkadeType.Enabled = true;
                txtSkadeBeskrivelse.Enabled = true;
            }
            else if (tilstand == "opretMark")
            {
                return;
            }
            else
            {
                MessageBox.Show("Der skal vælges en mark.", "Mangler valgt mark", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
        
        private void btnFjernSkader_Click(object sender, EventArgs e)
        {
            if (tilstand == "ingen" && lsbSkader.SelectedItems.Count > 0)
            {
                if (MessageBox.Show("Ønsker du at slette?", "Slet skade?", MessageBoxButtons.OKCancel) == DialogResult.OK)
                {
                    int selectedIndex = lsbSkader.SelectedIndices[0];
                    voresSkader.FjernMySkade(selectedIndex);
                    updateSkader();
                    resetSkaderFelter();
                }
            }
            else if (tilstand == "ingen")
            {
                MessageBox.Show("Der skal vælges en skade.", "Mangler valgt skade", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void btnSkaderFortryd_Click(object sender, EventArgs e)
        {
            if (tilstand != "ingen")
            {
                updateSkader();
                resetSkaderFelter();
            }
        }

        private void btnSkaderGem_Click(object sender, EventArgs e)
        {
            if (tilstand == "opretSkade" || tilstand == "redigerSkade")
            {
                // Konverter navn textbox samt beskrivelse textbox til string

                string MarkNummer = Convert.ToString(cbMarkNummer.SelectedItem);
                string SkadeType = Convert.ToString(txtSkadeType.Text);
                string SkadeBeskrivelse = Convert.ToString(txtSkadeBeskrivelse.Text);
                

                // Tjek om der er noget i de 3 ovenstående, og om de er gyldige
                if (MarkNummer.Length <= 0)
                {
                    MessageBox.Show("Nummer mangler.", "Fejl i nummer", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                if (SkadeType.Length <= 0)
                {
                    MessageBox.Show("Skadetype mangler.", "Fejl i skadetype", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                if (SkadeBeskrivelse.Length <= 0)
                {
                    MessageBox.Show("Beskrivelse mangler.", "Fejl i beskrivelse", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                // Hvis vi er i opretTilstand
                if (tilstand == "opretSkade")
                {
                    voresSkader.SetMySkade(MarkNummer, SkadeType, SkadeBeskrivelse);
                    resetSkaderFelter();
                    updateSkader();
                }
                // Hvis vi er er redigerTilstant
                else if (tilstand == "redigerSkade")
                {
                    int selectedIndex = lsbSkader.SelectedIndices[0];
                    voresSkader.updateMySkade(selectedIndex, MarkNummer, SkadeType, SkadeBeskrivelse);
                    resetSkaderFelter();
                    updateSkader();
                }
            }
        }

        private void lsbSkader_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (tilstand != "opretSkade" && lsbSkader.SelectedItems.Count > 0)
            {
                int selectedIndex = lsbSkader.SelectedIndices[0];
                ListViewItem minListe = lsbSkader.Items[selectedIndex];
                cbMarkNummer.Text = minListe.SubItems[0].Text;
                txtSkadeType.Text = minListe.SubItems[1].Text;
                txtSkadeBeskrivelse.Text = minListe.SubItems[2].Text;
            }
        }

        // Opdater listview
        private void updateSkader()
        {
            // Opdater opgaver listview
            lsbSkader.Items.Clear();
            List<Skader> minListe = voresSkader.GetMySkade();

            foreach (var item in minListe)
            {
                string MarkNummer = Convert.ToString(item.MarkNummer);
                string SkadeType = Convert.ToString(item.SkadeType);
                string SkadeBeskrivelse = Convert.ToString(item.Beskrivelse);

                ListViewItem mineItems = new ListViewItem(new[] { MarkNummer, SkadeType, SkadeBeskrivelse });
                lsbSkader.Items.Add(mineItems);
            }

            // Opdater sted comboboks
            cbMarkNummer.Items.Clear();
            foreach (var item in voresMarker.GetMyMark())
            {
                cbMarkNummer.Items.Add(item.Nummer1 + "-" + item.Nummer2 + " : " + item.Adresse);
            }
        }

        // Reset felter
        private void resetSkaderFelter()
        {
            cbMarkNummer.Enabled = false;
            cbMarkNummer.SelectedIndex = -1;

            txtSkadeType.Enabled = false;
            txtSkadeType.Text = "";

            txtSkadeBeskrivelse.Enabled = false;
            txtSkadeBeskrivelse.Text = "";



            lsbMarker.SelectedItems.Clear();
            // Reset tilstand
            tilstand = "ingen";
        }

        #endregion


        //-------
        // Sorter
        //-------
        #region Sorter

        // Opret sort metode
        private void btnOpretSort_Click(object sender, EventArgs e)
        {
            if (tilstand == "ingen")
            {
                resetSorterFelter();
                tilstand = "opretSort";
                txtSortNavn.Enabled = true;
                txtSortNummer.Enabled = true;
                cbSortType.Enabled = true;
            }
        }

        // Rediger sort metode
        private void btnRedigerSort_Click(object sender, EventArgs e)
        {
            if (lsbSorter.SelectedItems.Count > 0 && tilstand == "ingen")
            {
                tilstand = "redigerSort";
                txtSortNavn.Enabled = true;
                txtSortNummer.Enabled = true;
                cbSortType.Enabled = true;
            }
            else if (tilstand == "opretSort")
            {
                return;
            }
            else
            {
                MessageBox.Show("Der skal vælges en sort.", "Mangler valgt sort", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }

        }

        // Fjern sort metode
        private void btnFjernSort_Click(object sender, EventArgs e)
        {
            if (tilstand == "ingen" && lsbSorter.SelectedItems.Count > 0)
            {
                if (MessageBox.Show("Ønsker du at slette?", "Slet sort?", MessageBoxButtons.OKCancel) == DialogResult.OK)
                {
                    int selectedIndex = lsbSorter.SelectedIndices[0];
                    voresSorter.FjernMySort(selectedIndex);
                    updateSorter();
                    resetSorterFelter();
                }
            }
            else if (tilstand == "ingen")
            {
                MessageBox.Show("Der skal vælges en sort.", "Mangler valgt sort", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        // Fortryd sort metode
        private void btnSorterFortryd_Click(object sender, EventArgs e)
        {
            if (tilstand != "ingen")
            {
                resetSorterFelter();
                updateSorter();
            }
        }

        // Gem sort metode
        private void btnGemSort_Click(object sender, EventArgs e)
        {
            if (tilstand == "opretSort" || tilstand == "redigerSort")
            {
                // Dekleration af sort nummer og tryparse test om det er et nummer, hvis ikke vis message boks og stop
                int sortNummer;
                bool test = int.TryParse(txtSortNummer.Text, out sortNummer);
                if (!test)
                {
                    MessageBox.Show("Nummer mangler, eller er ikke numrisk.", "Fejl i nummer", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                // Konverter sortTavn textbox samt sortType textbox til string
                string sortNavn = Convert.ToString(txtSortNavn.Text);
                string sortType = Convert.ToString(cbSortType.SelectedItem);

                // Tjek om der er noget i både sortNavn og sortType
                if (sortNavn.Length <= 0)
                {
                    MessageBox.Show("Navn mangler.", "Fejl i navn", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                if (sortType.Length <= 0)
                {
                    MessageBox.Show("Type ikke valgt.", "Fejl i type", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                // Hvis vi er i opretTilstand
                if (tilstand == "opretSort")
                {
                    voresSorter.SetMySort(sortNummer, sortNavn, sortType);
                    resetSorterFelter();
                    updateSorter();
                }
                // Hvis vi er er redigerTilstant
                else if (tilstand == "redigerSort")
                {
                    int selectedIndex = lsbSorter.SelectedIndices[0];
                    voresSorter.updateMySort(selectedIndex, sortNummer, sortNavn, sortType);
                    resetSorterFelter();
                    updateSorter();
                }
            }
        }

        // Når en sort vælges
        private void lsbSorter_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (tilstand != "opretSort" && lsbSorter.SelectedItems.Count > 0)
            {
                int selectedIndex = lsbSorter.SelectedIndices[0];
                ListViewItem minListe = lsbSorter.Items[selectedIndex];
                txtSortNummer.Text = minListe.SubItems[0].Text;
                txtSortNavn.Text = minListe.SubItems[1].Text;
                cbSortType.Text = minListe.SubItems[2].Text;
            }
        }

        // Opdater listview
        private void updateSorter()
        {

            // Opdater Sorter listview
            lsbSorter.Items.Clear();
            List<Sort> minListe = voresSorter.GetMySort();
            
            foreach (var item in minListe)
            {
                // Konverter alle elementer
                string nummer = Convert.ToString(item.SortNummer);
                string navn = Convert.ToString(item.SortNavn);
                string type = Convert.ToString(item.SortType);
                
                // Lav en arrayliste med elementerne
                ListViewItem mineItems = new ListViewItem(new[] { nummer, navn, type });
                
                // Sæt listen ind i listview'et
                lsbSorter.Items.Add(mineItems);
            }

            // Opdater type comboboks
            cbSortType.Items.Clear();
            foreach (var item in voresTyper.GetMyType())
            {
                cbSortType.Items.Add(item);
            }
        }

        // Reset felter
        private void resetSorterFelter()
        {
            txtSortNavn.Text = "";
            txtSortNavn.Enabled = false;
            txtSortNummer.Enabled = false;
            txtSortNummer.Text = "";
            cbSortType.Enabled = false;
            cbSortType.SelectedIndex = -1;
            lsbSorter.SelectedItems.Clear();
            // Reset tilstand
            tilstand = "ingen";
        }

        #endregion


        //------
        // Typer
        //------
        #region Typer

        // Opret type metode
        private void btnTypeOpret_Click(object sender, EventArgs e)
        {
            if (tilstand == "ingen")
            {
                resetTypeFelter();
                tilstand = "opretType";
                txtTypeNavn.Enabled = true;
            }
        }

        // Rediger type metode
        private void btnTypeRediger_Click(object sender, EventArgs e)
        {
            if (lsbType.SelectedItems.Count > 0 && tilstand == "ingen")
            {
                tilstand = "redigerType";
                txtTypeNavn.Enabled = true;
            }
            else if (tilstand == "opretType")
            {
                return;
            }
            else
            {
                MessageBox.Show("Der skal vælges en type.", "Mangler valgt type", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        // Fjern type metode
        private void btnTypeFjern_Click(object sender, EventArgs e)
        {
            if (tilstand == "ingen" && lsbType.SelectedItems.Count > 0)
            {
                if (MessageBox.Show("Ønsker du at slette?", "Slet type?", MessageBoxButtons.OKCancel) == DialogResult.OK)
                {
                    int selectedIndex = lsbType.SelectedIndices[0];
                    voresTyper.FjernMyType(selectedIndex);
                    updateTyper();
                    resetTypeFelter();
                }
            }
            else if (tilstand == "ingen")
            {
                MessageBox.Show("Der skal vælges en type.", "Mangler valgt type", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        // Fortryd type metode
        private void btnTypeFortryd_Click(object sender, EventArgs e)
        {
            if (tilstand != "ingen")
            {
                resetTypeFelter();
                updateTyper();
            }
        }

        // Gem type metode
        private void btnTypeGem_Click(object sender, EventArgs e)
        {
            if (tilstand == "opretType" || tilstand == "redigerType")
            {
                // Deklerer typeNavn og sæt til textbox samt test efter om der er noget i feltet, hvis ikke vis fejl og stop
                string typeNavn = txtTypeNavn.Text;
                if (typeNavn.Length <= 0)
                {
                    MessageBox.Show("Navn mangler.", "Fejl i navn", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }

                // Hvis i opretTilstand
                if (tilstand == "opretType")
                {
                    voresTyper.SetMyType(typeNavn);
                    updateTyper();
                    resetTypeFelter();
                }

                // Hvis i redigerTilstand
                else if (tilstand == "redigerType")
                {
                    int selectedIndex = lsbType.SelectedIndices[0];
                    voresTyper.updateMyType(selectedIndex, typeNavn);
                    updateTyper();
                    resetTypeFelter();
                }
            }
        }

        // Når en type vælges
        private void lsbType_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (tilstand != "opretType" && lsbType.SelectedItems.Count > 0)
            {
                int selectedIndex = lsbType.SelectedIndices[0];
                ListViewItem minListe = lsbType.Items[selectedIndex];
                txtTypeNavn.Text = minListe.SubItems[0].Text;
            }
        }

        // Opdater listview
        private void updateTyper()
        {
            // Opdater Sorter listview
            lsbType.Items.Clear();

            foreach (var item in voresTyper.GetMyType())
            {
                lsbType.Items.Add(item);
            }
        }

        // Reset felter
        private void resetTypeFelter()
        {
            txtTypeNavn.Text = "";
            txtTypeNavn.Enabled = false;
            lsbType.SelectedItems.Clear();
            // Reset tilstand
            tilstand = "ingen";
        }
        
        #endregion

        

     
    }
}